package cn.edu.swu.cly.io;

import java.io.IOException;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.util.Objects;
import java.util.Calendar;
import java.text.SimpleDateFormat;

public class FileUtils {
//    //inputStream及其子类是专门处理"从各种数据源读取数据"
//
//    public void copy(String sourceFilePath, String targetFilePath){
//        System.out.println("copy file" + sourceFilePath + "to" + targetFilePath);
//        long start = Calendar.getInstance().getTimeInMillis();
//
//        try(InputStream inputStream = new FileInputStream(sourceFilePath)) {        //try()括号内是实现接口的对象
//            try(OutputStream outputStream = new FileOutputStream(targetFilePath)) {
//                int count;
//                byte[] buffer = new byte[1024 * 4];         //缓冲4k大小
//                while((count = inputStream.read(buffer)) != -1) {       //read读取buffer里缓存的数据，不再直接读source了
//                    outputStream.write(buffer, 0 ,count);
//                }
//            }
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//
//        long end = Calendar.getInstance().getTimeInMillis();
//        System.out.println("使用时间：" + (end - start));
//    }
//
//    //该方法读取缓慢，频繁进行磁盘io
//    public void copy1(String sourceFilePath, String targetFilePath) {
//        //打印信息：正在复制
//        System.out.println("copy file" + sourceFilePath + "to" + targetFilePath);
//
//        FileInputStream inputStream = null;     //读取源文件
//        FileOutputStream outputStream = null;   //写入目标文件
//
//        try {
//            inputStream = new FileInputStream(sourceFilePath);
//            outputStream = new FileOutputStream(targetFilePath);        //1.捕获：路径可能失效，文件不存在。2.也能捕获流程操作错我
//
//            int data;
//            while ((data = inputStream.read()) != -1) {
//                //读取一个字节就把字节写入到输出流中
//                outputStream.write(data);
//            }
//        } catch (IOException e) {       //捕获异常的固定语法，e是异常的实例对象，指代具体发生的错误
//            e.fillInStackTrace();       //捕获异常
//        } finally {
//            if (outputStream != null) {     //如果outputstream创建成功，再去关闭流
//                try {                       //3.1：输出流关闭出错(关闭文件本身可能出错)
//                    outputStream.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);      //抛出一个新的运行时异常，固定是throw new...
//                }
//            }
//        }
//
//        try {               //3.2：捕获关闭：输入流过程的错误
//            Objects.requireNonNull(inputStream).close();
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }

    public static void saveImage(String url, String savePath) throws IOException {      //类似WebDownloader的处理方法

        //URL下载图片保存到指定路径

        //1.1：检查目录的存在
        ensureDirectoryExists(new File(savePath).getParent());

        URL imageUrl = new URL(url);
        try (InputStream in = imageUrl.openStream();
             FileOutputStream out = new FileOutputStream(savePath)) {
            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        }
        //1.2：录入到下载日志
        String log = "Downloaded: " + url + " -> " + savePath;
        appendLog(log);
    }

    //ensureDirectoryExists检查目录存在
    public static void ensureDirectoryExists(String dirPath) {
        if (dirPath == null || dirPath.isEmpty()) {
            return;
        }
        File dir = new File(dirPath);
        if (!dir.exists()) {
            //递归创建目录（包括所有不存在的父目录）
            boolean created = dir.mkdirs();
            if (!created) {
                throw new RuntimeException("无法创建目录: " + dirPath);
            }
        }
    }

    //记录下载日志
    public static void appendLog(String log) {
        String logPath = "D:\\java\\workspace\\JavaWeb2025\\2_java_io\\download_log.txt";

        //目标案例：2025-09-23 20:00:01 Downloaded: https://example.com/cat.jpg -> images/cat.jpg
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(logPath, true))) {   //FileWriter第二个参数是“追加模式”的开起，避免写入的时候覆盖(重写)
            //记录时间
            String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());   //年年-月月-日日 24小时制：分分：秒秒。format格式化
            writer.write(time + " " + log);
            writer.newLine();
        } catch (IOException e) {
            System.out.println("日志记录失败：" + e.getMessage());
        }
    }
}
